package org.springblade.modules.admin.task.feishu;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.enums.FeiShuDocumentEnum;
import org.springblade.modules.admin.dto.feishu.FeiShuBatchDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuFieldsDTO;
import org.springblade.modules.admin.service.ElevatorService;
import org.springblade.modules.admin.service.feishu.IFeiShuDocumentService;
import org.springblade.modules.admin.vo.feishu.ElevatorDataReportVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 凤仪的飞书 自动扶梯/曳引梯 多为表格更新Job
 * @author: Sharry
 * @createTime: 2024-01-22 10:55
 * @version: Version-1.0
 */
@Component
@Slf4j
public class ElevatorDataReportJob {

	@Autowired
	private ElevatorService elevatorService;

	@Autowired
	private IFeiShuDocumentService feiShuDocumentService;

	/**
	 * 更新飞书自动扶梯/曳引梯检验报告
	 */
	public void updateElevatorDataReport(){
		// 0. 数据准备：appToken、tableId
		String appToken = FeiShuDocumentEnum.GALAXY_AUTO_ELEVATOR_REPORT.getAppToken();
		String autoTableId = FeiShuDocumentEnum.GALAXY_AUTO_ELEVATOR_REPORT.getTableId();
		String tractionTableId = FeiShuDocumentEnum.GALAXY_TRACTION_ELEVATOR_REPORT.getTableId();
		// 发送消息
		String autoResult = "";
		String tractionResult = "";
		// 1. 获取所有飞书自动扶梯/曳引梯检验报告数据；数据处理：根据device_category分组
		List<ElevatorDataReportVO> allReportVO = elevatorService.getElevatorDataReportVO();
		// 1.1 获取飞书自动扶梯检验报告
		List<ElevatorDataReportVO> autoElevatorReportVO = allReportVO
			.stream()
			.filter(f -> "自动扶梯".equals(f.getDeviceCategory()))
			.collect(Collectors.toList());
		// 1.2 获取其它类型
		List<ElevatorDataReportVO> tractionElevatorReportVO = allReportVO
			.stream()
			.filter(f -> !"自动扶梯".equals(f.getDeviceCategory()))
			.collect(Collectors.toList());
		// 1.3 两组目标数据封装，以下出现括号全角半角模糊的key，不要问，问就是要让凤仪改，改完再代码同步改
		// 1.3.1 自动扶梯数据封装
		List<FeiShuFieldsDTO> autoElevatorRecords = new ArrayList<>();
		for (ElevatorDataReportVO u : autoElevatorReportVO) {
			FeiShuFieldsDTO element = new FeiShuFieldsDTO();
			Map<String, Object> elementMap = new HashMap<>(10);
			elementMap.put("设备代码", u.getPrivateNum());
			elementMap.put("设备类别", u.getDeviceType());
			elementMap.put("设备品种", u.getDeviceCategory());
			elementMap.put("型号", u.getModelNumber());
			elementMap.put("产品编号", u.getProductNumber());
			elementMap.put("制造日期", u.getManufacturingDate());
			elementMap.put("制造单位名称", u.getManufacturingName());
			elementMap.put("使用单位代码", u.getCompanyCode());
			elementMap.put("使用登记证编号", u.getRegistrationNum());
			elementMap.put("设备使用地点", u.getDeviceLocation());
			elementMap.put("单位内编号", u.getCompanyPrivateNum());
			elementMap.put("安全管理人员", u.getSafetyUser());
			elementMap.put("使用单位名称", u.getCompanyName());
			elementMap.put("名义速度(m/s）", u.getNominalSpeed());
			elementMap.put("名义宽度(mm)", u.getNominalWidth());
			elementMap.put("倾斜角（°）", u.getSlantAngle());
			elementMap.put("输送能力(P/h)",u.getDeliveryValue());
			elementMap.put("提升高度(m）", u.getHoistingHeight());
			elementMap.put("使用区长度(m)", u.getAreaLength());
			element.setFields(elementMap);
			autoElevatorRecords.add(element);
		}
		FeiShuBatchDTO autoElevatorBatchDTO = getAndDistinctByHand(autoElevatorRecords);
		// 1.3.2 曳引梯数据封装
		List<FeiShuFieldsDTO> tractionElevatorRecords = new ArrayList<>();
		for (ElevatorDataReportVO u : tractionElevatorReportVO) {
			FeiShuFieldsDTO element = new FeiShuFieldsDTO();
			Map<String, Object> elementMap = new HashMap<>(10);
			elementMap.put("设备代码", u.getPrivateNum());
			elementMap.put("设备类别", u.getDeviceType());
			elementMap.put("设备品种", u.getDeviceCategory());
			elementMap.put("使用登记证编号", u.getRegistrationNum());
			elementMap.put("使用单位名称", u.getCompanyName());
			elementMap.put("设备使用地点", u.getDeviceLocation());
			elementMap.put("单位内编号", u.getCompanyPrivateNum());
			elementMap.put("使用单位代码", u.getCompanyCode());
			elementMap.put("安全管理人员", u.getSafetyUser());
			elementMap.put("制造单位名称", u.getManufacturingName());
			elementMap.put("制造日期", u.getManufacturingDate());
			elementMap.put("型号", u.getModelNumber());
			elementMap.put("产品编号", u.getProductNumber());
			elementMap.put("额定载重量(kg）", u.getRatedDeadweight());
            elementMap.put("额定速度(m/s)", u.getRatedSpeed());
			elementMap.put("层站数(层）", u.getFloor());
			elementMap.put("层站数(站）", u.getStand());
			elementMap.put("层站数(门）", u.getDoor());
			elementMap.put("控制方式",u.getControlMode());
			element.setFields(elementMap);
			tractionElevatorRecords.add(element);
		}
		FeiShuBatchDTO tractionElevatorBatchDTO = getAndDistinctByHand(tractionElevatorRecords);
		// 2. 更新飞书自动扶梯检验报告,当前策略: 根据设备代码更新
		autoResult = feiShuDocumentService.commandCompareUpdateBatch(
			appToken,
			autoTableId,
			autoElevatorBatchDTO,
			"设备代码");
		// 3. 更新飞书曳引梯检验报告,当前策略：根据设备代码更新
		tractionResult = feiShuDocumentService.commandCompareUpdateBatch(
			appToken,
			tractionTableId,
			tractionElevatorBatchDTO,
			"设备代码");
		// 4. 发送消息
		log.info("自动扶梯检验报告更新结果:{}", autoResult);
		log.info("曳引梯检验报告更新结果:{}", tractionResult);
		List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
		List<String> chatIds = new ArrayList<>();
		targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
		// 发送消息
		String finalResult = "自动扶梯检验报告更新结果:" + autoResult + " 曳引梯检验报告更新结果:" + tractionResult;
		chatIds.forEach(c -> {
			// 组装数据
			JSONObject bodyJson = new JSONObject();
			bodyJson.put("receive_id", c);
			bodyJson.put("msg_type", "text");
			HashMap<String, String> contentMap = new HashMap<>(2);
			String message = "根据设备代码更新以下两个表格。" + finalResult;
			contentMap.put("text", message);
			// 将 contentMap 转换成 JSON 格式
			bodyJson.put("content", JSON.toJSONString(contentMap));
			feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
		});
	}

	private FeiShuBatchDTO getAndDistinctByHand(List<FeiShuFieldsDTO> records) {
		FeiShuBatchDTO batchDTO = new FeiShuBatchDTO();
		// records 去重
		Set<FeiShuFieldsDTO> set = new HashSet<>(records);
		// 清空 records, 将 set 中的数据添加到 records 中
		records.clear();
		records.addAll(set);
		batchDTO.setRecords(records);
		return batchDTO;
	}

}
